#ifndef MEDIAPLAYER_H
#define MEDIAPLAYER_H
#include  <mutex>
#include <thread>
#include <functional>
#include "ffplay.h"

extern "C" {
#include "libavcodec/avcodec.h"
}

/*-空闲状态
 * ijkmp_set_data_source()  -> MP_STATE_INITIALIZED
 *
 * ijkmp_reset              -> self
 * ijkmp_release            -> MP_STATE_END结束状态，值为9
 */
#define MP_STATE_IDLE               0

/*-初始状态
 * ijkmp_prepare_async()    -> MP_STATE_ASYNC_PREPARING异步准备状态,值为2
 *
 * ijkmp_reset              -> MP_STATE_IDLE空闲状态，值为0
 * ijkmp_release            -> MP_STATE_END结束状态，值为9
 */
#define MP_STATE_INITIALIZED        1

/*-异步准备状态
 *                   ...    -> MP_STATE_PREPARED播放器准备就绪状态，值为3
 *                   ...    -> MP_STATE_ERROR错误状态，值为8
 *
 * ijkmp_reset              -> MP_STATE_IDLE空闲状态，值为0
 * ijkmp_release            -> MP_STATE_END结束状态，值为9
 */
#define MP_STATE_ASYNC_PREPARING    2

/*-播放器准备就绪状态
 * ijkmp_seek_to()          -> self
 * ijkmp_start()            -> MP_STATE_STARTED正在播放状态，值为4
 *
 * ijkmp_reset              -> MP_STATE_IDLE空闲状态，值为0
 * ijkmp_release            -> MP_STATE_END结束状态，值为9
 */
#define MP_STATE_PREPARED           3

/*-正在播放状态
 * ijkmp_seek_to()          -> self
 * ijkmp_start()            -> self
 * ijkmp_pause()            -> MP_STATE_PAUSED暂停状态，值为5
 * ijkmp_stop()             -> MP_STATE_STOPPED播放器停止状态，值为7
 *                   ...    -> MP_STATE_COMPLETED播放完成状态，值为6
 *                   ...    -> MP_STATE_ERROR错误状态，值为8
 *
 * ijkmp_reset              -> MP_STATE_IDLE空闲状态，值为0
 * ijkmp_release            -> MP_STATE_END结束状态，值为9
 */
#define MP_STATE_STARTED            4

/*-暂停状态
 * ijkmp_seek_to()          -> self
 * ijkmp_start()            -> MP_STATE_STARTED正在播放状态，值为4
 * ijkmp_pause()            -> self
 * ijkmp_stop()             -> MP_STATE_STOPPED播放器停止状态，值为7
 *
 * ijkmp_reset              -> MP_STATE_IDLE空闲状态，值为0
 * ijkmp_release            -> MP_STATE_END结束状态，值为9
 */
#define MP_STATE_PAUSED             5

/*-播放完成状态
 * ijkmp_seek_to()          -> self
 * ijkmp_start()            -> MP_STATE_STARTED (from beginning)正在播放状态，值为4
 * ijkmp_pause()            -> self
 * ijkmp_stop()             -> MP_STATE_STOPPED播放器停止状态，值为7
 *
 * ijkmp_reset              -> MP_STATE_IDLE空闲状态，值为0
 * ijkmp_release            -> MP_STATE_END结束状态，值为9
 */
#define MP_STATE_COMPLETED          6

/*-播放器停止状态
 * ijkmp_stop()             -> self
 * ijkmp_prepare_async()    -> MP_STATE_ASYNC_PREPARING异步准备状态,值为2
 *
 * ijkmp_reset              -> MP_STATE_IDLE空闲状态，值为0
 * ijkmp_release            -> MP_STATE_END结束状态，值为9
 */
#define MP_STATE_STOPPED            7

/*-错误状态
 * ijkmp_reset              -> MP_STATE_IDLE空闲状态，值为0
 * ijkmp_release            -> MP_STATE_END结束状态，值为9
 */
#define MP_STATE_ERROR              8

/*-结束状态
 * ijkmp_release            -> self
 */
#define MP_STATE_END                9

#define  MP_SEEK_STEP            10  // 快退快进步长10秒

class MediaPlayer
{
public:
    MediaPlayer();
    ~MediaPlayer();
    int ijkmp_create(std::function<int(void *)> msg_loop);
    int ijkmp_destroy();
    // 设置要播放的url
    int ijkmp_set_data_source(const char *url);
    // 准备播放
    int ijkmp_prepare_async();
    // 触发播放
    int ijkmp_start();
    // 停止
    int ijkmp_stop();
    // 暂停
    int ijkmp_pause();
    // seek到指定位置
    int ijkmp_seek_to(long msec);
    // 快进
    int ijkmp_forward_to(long incr);
    // 快退
    int ijkmp_back_to(long incr);

    int ijkmp_screenshot(char *file_path);
    // 获取播放状态
    int ijkmp_get_state();
    // 是不是播放中
    bool ijkmp_is_playing();
    // 当前播放位置
    long ijkmp_get_current_position();
    // 总长度
    long ijkmp_get_duration();
    // 已经播放的长度
    long ijkmp_get_playable_duration();
    // 设置循环播放
    void ijkmp_set_loop(int loop);
    // 获取是否循环播放
    int  ijkmp_get_loop();
    // 读取消息
    int ijkmp_get_msg(AVMessage *msg, int block);
    // 设置音量
    void ijkmp_set_playback_volume(int volume);

    int ijkmp_msg_loop(void *arg);

    void ijkmp_set_playback_rate(float rate);
    float ijkmp_get_playback_rate();
    void AddVideoRefreshCallback(std::function<int(const Frame *)> callback);

    // 获取状态值
    int64_t ijkmp_get_property_int64(int id, int64_t default_value);

    void ijkmp_change_state_l(int new_state);
private:
    // 互斥量
    std::mutex mutex_;
    // 真正的播放器
    FFPlayer *ffplayer_ = NULL;
    //函数指针, 指向创建的message_loop，即消息循环函数
    //    int (*msg_loop)(void*);
    std::function<int (void *)> msg_loop_ = NULL; // ui处理消息的循环
    //消息机制线程
    std::thread *msg_thread_; // 执行msg_loop
    //    SDL_Thread _msg_thread;
    //字符串，就是一个播放url，或文件路经
    char *data_source_;
    //播放器状态，例如prepared,resumed,error,completed等
    int mp_state_;  // 播放状态

    int seek_req = 0;
    long seek_msec = 0;

    // 截屏请求
    char *file_path_ = NULL;
};



#endif // MEDIAPLAYER_H
